#!/bin/zsh
set +e
export PATH="/usr/local/bin:/opt/homebrew/bin:/Applications/Ollama.app/Contents/Resources:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"
export PIXELPAW_PROTECTED_PORTS="${PIXELPAW_PROTECTED_PORTS:-3001}"
export OLLAMA_HOST="${OLLAMA_HOST:-http://127.0.0.1:11434}"
export PIXELPAW_SHOW_INSTALL_PROGRESS="${PIXELPAW_SHOW_INSTALL_PROGRESS:-0}"
export PIXELPAW_DETACH_SERVER="${PIXELPAW_DETACH_SERVER:-1}"
export PIXELPAW_PORTABLE_LOG_DIR="${PIXELPAW_PORTABLE_LOG_DIR:-$HOME/Library/Application Support/Pixelpaw Local Agent Test/logs}"
export PIXELPAW_SUPPORT_DIR="${PIXELPAW_SUPPORT_DIR:-$HOME/Library/Application Support/Pixelpaw Local Agent Test}"
export PIXELPAW_DATA_DIR="${PIXELPAW_DATA_DIR:-$HOME/Library/Application Support/Pixelpaw Local Agent Test/data}"
export PIXELPAW_PREVIEW_RUNTIME="${PIXELPAW_PREVIEW_RUNTIME:-1}"
export PIXELPAW_ORCHESTRATOR_V2="${PIXELPAW_ORCHESTRATOR_V2:-on}"
export PIXELPAW_RELEASE_CHANNEL="${PIXELPAW_RELEASE_CHANNEL:-internal-preview}"
export PIXELPAW_API_PORT="${PIXELPAW_API_PORT:-3295}"
export PIXELPAW_PERMISSION_PROFILE="${PIXELPAW_PERMISSION_PROFILE:-local-trusted-agent}"
export PIXELPAW_APPROVAL_UI="${PIXELPAW_APPROVAL_UI:-off}"
export PIXELPAW_ISOLATION_REQUIRED="${PIXELPAW_ISOLATION_REQUIRED:-1}"
export PIXELPAW_EXTERNAL_MUTATION="${PIXELPAW_EXTERNAL_MUTATION:-deny}"
export PIXELPAW_NETWORK_READ="${PIXELPAW_NETWORK_READ:-allow}"
APP_DIR="$(cd "$(dirname "$0")" && pwd)"
APP_CONTAINER="$(cd "$APP_DIR/../.." && pwd)"
APP_PARENT="$(cd "$APP_DIR/../../.." 2>/dev/null && pwd)"
APP_RUNTIME="$(cd "$APP_DIR/../Resources/PixelpawRuntime" 2>/dev/null && pwd)"
DEST="${PIXELPAW_INSTALL_DIR:-$HOME/Applications/Pixelpaw-0.5-Local-Agent-Test}"
SOURCE_RUNTIME=""

canonical_path() {
  local target="$1"
  local parent base
  parent="$(dirname "$target")"
  base="$(basename "$target")"
  if [ -d "$target" ]; then
    (cd "$target" 2>/dev/null && pwd)
    return 0
  fi
  (cd "$parent" 2>/dev/null && printf "%s/%s\n" "$(pwd)" "$base")
}

show_launch_error() {
  local message="$1"
  /usr/bin/osascript -e "display dialog \"Pixelpaw를 시작하지 못했습니다.\n\n$message\n\nDMG 또는 ZIP 패키지를 다시 내려받아 실행해 주세요.\" buttons {\"확인\"} default button \"확인\" with icon caution" >/dev/null 2>&1 || true
  exit 1
}

manifest_value() {
  local file="$1"
  local key="$2"
  if [ ! -f "$file" ]; then
    echo ""
    return 0
  fi
  /usr/bin/grep -m 1 "\"$key\"" "$file" | /usr/bin/sed -E 's/.*"'"$key"'"[[:space:]]*:[[:space:]]*"([^"]+)".*/\1/'
}

version_ge() {
  /usr/bin/awk -v left="$1" -v right="$2" '
    BEGIN {
      left_count = split(left, left_parts, ".");
      right_count = split(right, right_parts, ".");
      max_count = left_count > right_count ? left_count : right_count;
      for (part_index = 1; part_index <= max_count; part_index += 1) {
        left_value = left_parts[part_index] + 0;
        right_value = right_parts[part_index] + 0;
        if (left_value > right_value) exit 0;
        if (left_value < right_value) exit 1;
      }
      exit 0;
    }
  '
}

installed_runtime_is_same_or_newer() {
  if [ ! -x "$DEST/Pixelpaw.command" ]; then
    return 1
  fi
  local source_manifest="$SOURCE_RUNTIME/RELEASE_MANIFEST.json"
  local dest_manifest="$DEST/RELEASE_MANIFEST.json"
  local source_version dest_version source_generated dest_generated
  source_version="$(manifest_value "$source_manifest" appVersion)"
  dest_version="$(manifest_value "$dest_manifest" appVersion)"
  source_generated="$(manifest_value "$source_manifest" generatedAt)"
  dest_generated="$(manifest_value "$dest_manifest" generatedAt)"
  if [ -z "$source_version" ] || [ -z "$dest_version" ]; then
    return 0
  fi
  if version_ge "$dest_version" "$source_version"; then
    if [ "$dest_version" != "$source_version" ]; then
      return 0
    fi
    if [ -z "$source_generated" ] || [ -z "$dest_generated" ]; then
      return 0
    fi
    if [ "$dest_generated" = "$source_generated" ] || [[ "$dest_generated" > "$source_generated" ]]; then
      return 0
    fi
  fi
  return 1
}

sync_outer_app_bundle() {
  if [ -z "$APP_CONTAINER" ] || [ ! -d "$APP_CONTAINER" ]; then
    return 0
  fi
  if [ "$(basename "$APP_CONTAINER")" != "Pixelpaw 0.5 Local Agent Test.app" ]; then
    return 0
  fi
  local dest_app="$DEST/Pixelpaw 0.5 Local Agent Test.app"
  local source_app_canonical dest_app_canonical
  source_app_canonical="$(canonical_path "$APP_CONTAINER")"
  dest_app_canonical="$(canonical_path "$dest_app")"
  if [ "$source_app_canonical" = "$dest_app_canonical" ]; then
    return 0
  fi
  local source_manifest="$APP_RUNTIME/RELEASE_MANIFEST.json"
  local dest_manifest="$DEST/RELEASE_MANIFEST.json"
  local source_version dest_version source_generated dest_generated
  source_version="$(manifest_value "$source_manifest" appVersion)"
  dest_version="$(manifest_value "$dest_manifest" appVersion)"
  source_generated="$(manifest_value "$source_manifest" generatedAt)"
  dest_generated="$(manifest_value "$dest_manifest" generatedAt)"
  if [ -n "$source_version" ] && [ -n "$dest_version" ] && version_ge "$dest_version" "$source_version"; then
    if [ "$dest_version" != "$source_version" ]; then
      return 0
    fi
    if [ -n "$source_generated" ] && [ -n "$dest_generated" ] && [[ "$dest_generated" > "$source_generated" ]]; then
      return 0
    fi
  fi
  mkdir -p "$DEST"
  local replacement_app="$DEST/.pixelpaw-app-replacement.$$"
  rm -rf "$replacement_app"
  /usr/bin/ditto "$APP_CONTAINER" "$replacement_app"
  if [ ! -x "$replacement_app/Contents/MacOS/Pixelpaw" ] || [ ! -x "$replacement_app/Contents/Resources/PixelpawRuntime/Pixelpaw.command" ]; then
    rm -rf "$replacement_app"
    return 0
  fi
  rm -rf "$dest_app"
  mv "$replacement_app" "$dest_app"
  /usr/bin/xattr -dr com.apple.quarantine "$dest_app" >/dev/null 2>&1 || true
}

if [ -n "$APP_RUNTIME" ] && [ -x "$APP_RUNTIME/Pixelpaw.command" ]; then
  SOURCE_RUNTIME="$APP_RUNTIME"
elif [ -d "$APP_CONTAINER/.pixelpaw-runtime" ] && [ -x "$APP_CONTAINER/.pixelpaw-runtime/Pixelpaw.command" ]; then
  SOURCE_RUNTIME="$APP_CONTAINER/.pixelpaw-runtime"
elif [ -x "$APP_CONTAINER/Pixelpaw.command" ]; then
  SOURCE_RUNTIME="$APP_CONTAINER"
elif [ -n "$APP_PARENT" ] && [ -x "$APP_PARENT/Pixelpaw.command" ]; then
  SOURCE_RUNTIME="$APP_PARENT"
else
  show_launch_error "앱 안에서 실행에 필요한 파일을 찾지 못했습니다."
fi

DEST_CANONICAL="$(canonical_path "$DEST")"
APP_CONTAINER_CANONICAL="$(canonical_path "$APP_CONTAINER")"
APP_RUNTIME_CANONICAL="$(canonical_path "$APP_RUNTIME")"
if [[ "$DEST_CANONICAL" == "$APP_CONTAINER_CANONICAL"* ]] || [[ "$DEST_CANONICAL" == "$APP_RUNTIME_CANONICAL"* ]] || [[ "$DEST_CANONICAL" == /Volumes/* ]]; then
  DEST="$HOME/Applications/Pixelpaw-0.5-Local-Agent-Test"
fi

if installed_runtime_is_same_or_newer; then
  SOURCE_RUNTIME="$DEST"
fi

if [ "$SOURCE_RUNTIME" != "$DEST" ]; then
  mkdir -p "$(dirname "$DEST")"
  /usr/bin/ditto "$SOURCE_RUNTIME" "$DEST"
  /usr/bin/xattr -dr com.apple.quarantine "$DEST" >/dev/null 2>&1 || true
fi
sync_outer_app_bundle

cd "$DEST" || show_launch_error "실행 위치로 이동하지 못했습니다: $DEST"
if [ ! -x "./Pixelpaw.command" ]; then
  show_launch_error "실행 파일 권한이 올바르지 않습니다: $DEST/Pixelpaw.command"
fi

exec ./Pixelpaw.command
